/**
 * EASYUI 组件扩展
 * Created by 杨浩宇 on 2016/8/20 0020.
 */
(function (factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD
        define(['jquery'], factory);
    } else if (typeof exports === 'object') {
        // CommonJS
        factory(require('jquery'));
    } else {
        // Browser globals
        factory(jQuery);
    }
}(function ($) {
    /**
     * 扩展EASYUI的combobox实现中文、英文模糊匹配过滤
     * EASYUI原本的COMBOBOX其输入搜索仅仅支持英文搜索，而且仅支持起始字母匹配，不支持字符串中间匹配检索。
     * 通过重载 query，filter, onHidePanel 事件，实现支持中文、英文过滤。
     */
    $.extend($.fn.combobox.defaults, {
        filter: function(input, row) {
            // 清空内容, 则不过滤
            if (input == "") return true;

            input = input.toUpperCase();
            // 先判断显示值
            var opts = $(this).combobox('options');
            var text = row[opts.textField].toUpperCase();
            if (text.indexOf(input) >= 0) {
                return true;
            }else{
                return false;
            }
        } ,
        onHidePanel: function(){
            var el = $(this);
            el.combobox('textbox').focus();

            // 检查录入内容是否在数据里
            var opts = el.combobox("options");
            var data = el.combobox("getData");
            var value = el.combobox("getValue");

            // 有高亮选中的项目, 则不进一步处理
            var panel = el.combobox("panel");
            var items = panel.find(".combobox-item-selected");
            if (items.length > 0) {
                var values = el.combobox("getValues");
                el.combobox("setValues", values);
                return;
            }

            var allowInput = opts.allowInput;
            if (allowInput){
                // 允许录入, 并且当前下拉没内容(过滤掉了), 则加入下拉列表里
                var idx = data.length;

                data[idx] = [];
                data[idx][opts.textField] = value;
                data[idx][opts.valueField] = value;

                el.combobox("loadData", data);
            }else{
                // 不允许录入任意项, 则清空
                el.combobox("clear");
            }

        }
    });

    $.extend($.fn.combobox.defaults.keyHandler,{
        query: function(q, evt){

            var target = this;
            var el = $(this);

            var state = $.data(target, 'combobox');
            var opts = state.options;

            if (opts.multiple && !q){
                el.combobox("setValues", [], true);
            } else {
                el.combobox("setValues", [q], true);
            }

            if (opts.mode == 'remote'){

            } else {
                var panel = el.combo('panel');
                panel.find('div.combobox-item-selected,div.combobox-item-hover').removeClass('combobox-item-selected combobox-item-hover');
                panel.find('div.combobox-item,div.combobox-group').hide();
                var data = el.combobox("getData");
                var vv = [];
                var qq = opts.multiple ? q.split(opts.separator) : [q];
                $.map(qq, function(q){
                    q = $.trim(q);
                    for(var i=0; i<data.length; i++){
                        var row = data[i];
                        if (opts.filter.call(el, q, row)){
                            var v = row[opts.valueField];
                            var s = row[opts.textField];
                            var g = row[opts.groupField];
                            var item = opts.finder.getEl(target, v).show();
                            vv.push(v);
                        }
                    }
                });

                // 默认高亮第一项
                if (vv.length > 0 && q){
                    var v = vv[0];
                    var item = opts.finder.getEl(target, v);
                    item.addClass('combobox-item-selected');

                    // 只改value, 不改text
                    el.combo("setValues", [v], true);
                }
            }
        }
    });

    /**
     * 扩展EASYUI的combobox，增加selectedIndex方法，用于设置默认选中某一项。
     */
    $.extend(
        $.fn.combobox.methods, {
        selectedIndex: function (jq, index) {
            if (!index) {
                index = 0;
            }
            $(jq).combobox({
                onLoadSuccess: function () {
                    var opt = $(jq).combobox('options');
                    var data = $(jq).combobox('getData');

                    for (var i = 0; i < data.length; i++) {
                        if (i == index) {
                            $(jq).combobox('setValue', eval('data[index].' + opt.valueField));
                            break;
                        }
                    }
                }
            });
        }
    });
}));